Apache Commons Collections একটি শক্তিশালী লাইব্রেরি যা Java-তে বিভিন্ন ধরনের উন্নত ডেটা স্ট্রাকচার এবং ইউটিলিটি প্রদান করে। এর মধ্যে দুটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার হল Bag এবং MultiSet। এই স্ট্রাকচারগুলি সাধারণ Set এবং List এর মত নয়, কারণ এখানে উপাদানগুলি একাধিকবার উপস্থিত থাকতে পারে। একে অপরকে বেশ কিছু ক্ষেত্রে Set এবং List থেকে আলাদা করে তোলে।
Bag একটি কাস্টম ডেটা স্ট্রাকচার যা একটি কনটেইনারের মতো কাজ করে, যেখানে উপাদানগুলো একাধিকবার থাকতে পারে। এটি counting set এর মতো, অর্থাৎ, এটি ট্র্যাক করে যে একটি নির্দিষ্ট উপাদান কতবার যোগ করা হয়েছে।
Bag এর মধ্যে এমন ফিচার রয়েছে যা Set-এর তুলনায় আলাদা:
Bag ইন্টারফেসটি কিছু গুরুত্বপূর্ণ মেথড সরবরাহ করে:
add(Object o)
: একটি উপাদান যোগ করা।getCount(Object o)
: নির্দিষ্ট উপাদানের সংখ্যা জানানো।remove(Object o)
: উপাদান মুছে ফেলা।import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
public class BagExample {
public static void main(String[] args) {
// Bag তৈরি করা
Bag<String> bag = new HashBag<>();
// উপাদান যোগ করা
bag.add("apple");
bag.add("banana");
bag.add("apple");
// উপাদানটির সংখ্যা দেখানো
System.out.println("Apple count: " + bag.getCount("apple")); // Output: 2
System.out.println("Banana count: " + bag.getCount("banana")); // Output: 1
// সব উপাদান দেখানো
System.out.println("All elements: " + bag);
}
}
আউটপুট:
Apple count: 2
Banana count: 1
All elements: [apple, apple, banana]
এখানে:
"apple"
দুইবার এবং "banana"
একবার উপস্থিত রয়েছে।getCount("apple")
ব্যবহার করে "apple"
উপাদানটির উপস্থিতির সংখ্যা বের করা হয়েছে।MultiSet হল একটি কনসেপ্ট যা Bag এর মতোই কাজ করে। এটি এমন একটি ডেটা স্ট্রাকচার যা একাধিকবার একই উপাদান ধারণ করতে পারে। সাধারণত, Bag এবং MultiSet প্রায় সমান, তবে বিভিন্ন লাইব্রেরি বিভিন্ন নাম ব্যবহার করতে পারে।
Apache Commons Collections-এ Bag হল MultiSet
এর সমতুল্য, যেখানে Bag
এর ভিতরেই উপাদানগুলো একাধিকবার থাকতে পারে এবং তার উপস্থিতির সংখ্যা রেকর্ড করা যায়। তবে, আপনি MultiSet নামের আলাদা কিছু বাস্তবায়ন পেতে পারেন।
Bag এবং MultiSet এর মধ্যে তেমন কোনো বড় পার্থক্য নেই, কারণ উভয়ই একই ধরনের কাজ সম্পাদন করে:
তবে কিছু লাইব্রেরিতে এই দুটি ডেটা স্ট্রাকচারের জন্য আলাদা আলাদা নাম ব্যবহার করা হয়।
Bag এবং MultiSet বিশেষ করে তখন ব্যবহার করা হয় যখন:
উদাহরণস্বরূপ:
Bag হল অ্যাপাচি কমন্স কালেকশনস (Apache Commons Collections) লাইব্রেরির একটি ডেটা স্ট্রাকচার, যা একটি কালেকশনে আইটেমগুলোর সংখ্যা বা ফ্রিকোয়েন্সি ট্র্যাক করে। সাধারণ Set
বা List
এর বিপরীতে, একটি Bag
প্রতিটি উপাদানের সাথে তার উপস্থিতির সংখ্যাটি সংরক্ষণ করে।
মূল বৈশিষ্ট্য:
অ্যাপাচি কমন্স কালেকশনস এ বেশ কয়েকটি ক্লাস রয়েছে যা Bag ইন্টারফেস ইমপ্লিমেন্ট করে:
import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
public class BagExample {
public static void main(String[] args) {
// HashBag তৈরি
Bag<String> bag = new HashBag<>();
// আইটেম যোগ করা
bag.add("Apple");
bag.add("Banana", 2); // দুইবার Banana যোগ করা
bag.add("Orange");
// প্রতিটি আইটেমের ফ্রিকোয়েন্সি দেখা
System.out.println("Apple count: " + bag.getCount("Apple")); // আউটপুট: 1
System.out.println("Banana count: " + bag.getCount("Banana")); // আউটপুট: 2
// সব আইটেম দেখা
System.out.println("Bag elements: " + bag);
// একটি আইটেম সরানো
bag.remove("Banana");
System.out.println("Updated Bag elements: " + bag);
}
}
আউটপুট:
Apple count: 1
Banana count: 2
Bag elements: [1:Apple, 2:Banana, 1:Orange]
Updated Bag elements: [1:Apple, 1:Banana, 1:Orange]
Bag এমন ক্ষেত্রে ব্যবহার করা হয় যেখানে ডেটার ফ্রিকোয়েন্সি ট্র্যাক করতে হবে। যেমন:
Bag এমন পরিস্থিতিতে কার্যকর যেখানে ডুপ্লিকেট ডেটা সহজে পরিচালনা করতে হবে।
Bag ফ্রিকোয়েন্সি ডেটা বিশ্লেষণের জন্য উপকারী। উদাহরণস্বরূপ:
গেমের ইনভেন্টরি ব্যবস্থাপনা যেখানে একটি নির্দিষ্ট আইটেমের সংখ্যা প্রয়োজন।
TreeBag একটি Bag
যা আইটেমগুলোকে স্বাভাবিক ক্রমে (natural order) সাজিয়ে রাখে।
import org.apache.commons.collections4.bag.TreeBag;
public class TreeBagExample {
public static void main(String[] args) {
// TreeBag তৈরি
TreeBag<String> treeBag = new TreeBag<>();
// আইটেম যোগ করা
treeBag.add("Banana");
treeBag.add("Apple");
treeBag.add("Orange");
treeBag.add("Apple");
// সাজানো আইটেম
System.out.println("Sorted Bag: " + treeBag);
}
}
আউটপুট:
Sorted Bag: [2:Apple, 1:Banana, 1:Orange]
Bag একটি কার্যকর ডেটা স্ট্রাকচার যা ডেটার ফ্রিকোয়েন্সি বা সংখ্যা পরিচালনা করতে ব্যবহৃত হয়। এটি ডুপ্লিকেট ডেটার ব্যবস্থাপনা সহজ করে এবং বিভিন্ন ব্যবহারিক ক্ষেত্রে, যেমন ডেটা এনালাইসিস, ইনভেন্টরি ম্যানেজমেন্ট, এবং গেম ডেভেলপমেন্টে, অত্যন্ত কার্যকর।
অ্যাপাচি কমন্স কালেকশনস লাইব্রেরিতে Bag হলো একটি বিশেষ ডেটা স্ট্রাকচার, যা একটি কালেকশনে উপাদানগুলোর সংখ্যা (count) ট্র্যাক করতে ব্যবহৃত হয়। এর দুটি সাধারণ ইমপ্লিমেন্টেশন হল HashBag এবং TreeBag।
Bag একটি ইন্টারফেস, যা এমন কালেকশন প্রদান করে যেখানে প্রতিটি উপাদানের উপস্থিতির সংখ্যা সংরক্ষণ করা হয়। এটি সাধারণ Set-এর মতো হলেও, উপাদানগুলির সংখ্যা গুনে রাখতে পারে।
HashBag হল Bag-এর একটি ইমপ্লিমেন্টেশন, যা একটি HashMap ব্যবহার করে উপাদান এবং তাদের সংখ্যা সংরক্ষণ করে। এটি অর্ডার সংরক্ষণ করে না, তবে দ্রুত অ্যাক্সেস প্রদান করে।
TreeBag হল Bag-এর আরেকটি ইমপ্লিমেন্টেশন, যা একটি TreeMap ব্যবহার করে উপাদান এবং তাদের সংখ্যা সংরক্ষণ করে। এটি উপাদানগুলোকে সাজানো (sorted) অবস্থায় রাখে।
Comparable
ইন্টারফেস বা কাস্টম কম্পারেটর সমর্থন করে।import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
public class HashBagExample {
public static void main(String[] args) {
// HashBag তৈরি
Bag<String> hashBag = new HashBag<>();
// উপাদান যোগ করা
hashBag.add("Apple", 3);
hashBag.add("Orange", 2);
hashBag.add("Banana", 1);
// ডেটা রিট্রিভ করা
System.out.println("Bag contents: " + hashBag);
System.out.println("Count of Apple: " + hashBag.getCount("Apple"));
// উপাদান সরানো
hashBag.remove("Apple", 2);
System.out.println("Bag contents after removal: " + hashBag);
}
}
Bag contents: [Apple:3, Orange:2, Banana:1]
Count of Apple: 3
Bag contents after removal: [Apple:1, Orange:2, Banana:1]
import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.TreeBag;
public class TreeBagExample {
public static void main(String[] args) {
// TreeBag তৈরি
Bag<String> treeBag = new TreeBag<>();
// উপাদান যোগ করা
treeBag.add("Apple", 3);
treeBag.add("Orange", 2);
treeBag.add("Banana", 1);
// ডেটা রিট্রিভ করা
System.out.println("Bag contents (sorted): " + treeBag);
System.out.println("Count of Orange: " + treeBag.getCount("Orange"));
// উপাদান যোগ বা সরানো
treeBag.add("Grapes");
treeBag.remove("Apple", 1);
System.out.println("Bag contents after update: " + treeBag);
}
}
Bag contents (sorted): [Apple:3, Banana:1, Orange:2]
Count of Orange: 2
Bag contents after update: [Apple:2, Banana:1, Grapes:1, Orange:2]
বৈশিষ্ট্য | HashBag | TreeBag |
---|---|---|
অর্ডার | উপাদান অর্ডার সংরক্ষণ করে না | উপাদান সাজানো অবস্থায় থাকে |
ডেটা স্ট্রাকচার | HashMap ব্যবহার করে | TreeMap ব্যবহার করে |
পারফরম্যান্স | দ্রুত অ্যাক্সেস (O(1)) | তুলনামূলক ধীর (O(log n)) |
ব্যবহারক্ষেত্র | যখন সাজানোর প্রয়োজন নেই | যখন উপাদান সাজানোর প্রয়োজন হয় |
HashBag এবং TreeBag উভয়ই Bag
ইন্টারফেসের কার্যকর ইমপ্লিমেন্টেশন, তবে এদের ব্যবহার নির্ভর করে প্রয়োজনীয় পারফরম্যান্স এবং সাজানোর প্রয়োজনীয়তার উপর। HashBag দ্রুত কার্যক্রমের জন্য উপযুক্ত, যেখানে TreeBag সাজানো ডেটার জন্য কার্যকর। অ্যাপাচি কমন্স কালেকশনসের এই ফিচারগুলো ডেটা ম্যানেজমেন্টে আরও কার্যকরিতা যোগ করে।
অ্যাপাচি কমন্স কালেকশনস (Apache Commons Collections) লাইব্রেরি Java প্রোগ্রামিং ভাষায় বিভিন্ন ধরনের শক্তিশালী ডেটা স্ট্রাকচার এবং ইউটিলিটি ক্লাস সরবরাহ করে। এর মধ্যে দুটি গুরুত্বপূর্ণ ক্লাস হল TypedBag এবং SortedBag, যা আপনার ডেটা ম্যানিপুলেশনকে আরও কার্যকরী এবং সুবিধাজনক করে তোলে। এগুলি বিশেষভাবে উপকারী যখন আপনাকে নির্দিষ্ট ডেটা টাইপ বা ক্রম অনুসারে আইটেম সংরক্ষণ করতে হয়।
এই টিউটোরিয়ালে, আমরা TypedBag এবং SortedBag ক্লাসগুলি এবং এগুলির ব্যবহার কিভাবে করা হয় তা আলোচনা করব।
TypedBag হল একটি ধরনের Bag ডেটা স্ট্রাকচার যা শুধুমাত্র নির্দিষ্ট ধরনের (type-safe) উপাদান ধারণ করে। এটি সাধারণত Bag
এর মতো কাজ করে, তবে এখানে আপনি একটি নির্দিষ্ট টাইপ (যেমন String
, Integer
, ইত্যাদি) নির্ধারণ করে দিতে পারেন যাতে এটি কেবল সেই টাইপের উপাদান ধারণ করতে পারে। এর ফলে, এটি টাইপ সেফটি নিশ্চিত করে এবং ডেটা সংগ্রহে সঠিকতা বজায় রাখে।
TypedBag ব্যবহার করা হয় যখন আপনি একটি ডেটা স্ট্রাকচার চান যা শুধুমাত্র একটি নির্দিষ্ট টাইপের উপাদান ধারণ করবে, এবং এটি টাইপ সম্পর্কিত সমস্যা বা কনভার্সন এড়াতে সাহায্য করবে।
import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
import org.apache.commons.collections4.typed.TypedBag;
public class TypedBagExample {
public static void main(String[] args) {
// Create a TypedBag that only accepts Strings
Bag<String> typedBag = TypedBag.<String>typedBag(new HashBag<>());
// Add elements to the TypedBag
typedBag.add("apple");
typedBag.add("banana");
typedBag.add("apple");
// Print out the bag
System.out.println("Bag contents: " + typedBag);
System.out.println("Count of apple: " + typedBag.getCount("apple")); // Output: 2
}
}
এখানে:
TypedBag.<String>typedBag(new HashBag<>())
দিয়ে আমরা একটি TypedBag
তৈরি করেছি যা শুধুমাত্র String
টাইপের উপাদান গ্রহণ করবে।typedBag.add("apple")
দিয়ে apple
আইটেমটি যোগ করা হয়েছে এবং তার গণনা typedBag.getCount("apple")
ব্যবহার করে দেখানো হয়েছে।TypedBag এর ব্যবহার টাইপ সেফটি নিশ্চিত করতে সহায়তা করে, যার ফলে কোডে টাইপ সম্পর্কিত ভুল কমে যায় এবং ডেটার শুদ্ধতা নিশ্চিত হয়।
SortedBag হল একটি বিশেষ ধরনের Bag যা উপাদানগুলিকে একটি নির্দিষ্ট ক্রম (অর্থাৎ সোর্টেড অর্ডার) অনুযায়ী সংগঠিত করে রাখে। এটি সাধারণ Bag ডেটা স্ট্রাকচারের মতো কাজ করে, তবে এখানে ডেটাগুলি ক্রম অনুসারে সাজানো থাকে, যেমন অ্যালফাবেটিক্যাল অথবা নাম্বারিক্যাল।
এটি ব্যবহার করা হয় যখন আপনি চান যে আপনার Bag এর উপাদানগুলি একটি নির্দিষ্ট ক্রমে সাজানো থাকবে, যেমন সংখ্যার ক্রম বা অক্ষরের ক্রম।
import org.apache.commons.collections4.SortedBag;
import org.apache.commons.collections4.bag.TreeBag;
public class SortedBagExample {
public static void main(String[] args) {
// Create a SortedBag that sorts elements in natural order
SortedBag<String> sortedBag = new TreeBag<>();
// Add elements to the SortedBag
sortedBag.add("banana");
sortedBag.add("apple");
sortedBag.add("cherry");
// Print out the sorted bag
System.out.println("Sorted Bag contents: " + sortedBag);
}
}
এখানে:
TreeBag
হল একটি SortedBag ইমপ্লিমেন্টেশন যা উপাদানগুলিকে তাদের প্রাকৃতিক অর্ডারে সাজায় (যেমন apple
, banana
, cherry
অ্যালফাবেটিক্যালভাবে সাজানো হবে)।sortedBag.add("banana")
, sortedBag.add("apple")
, এবং sortedBag.add("cherry")
মাধ্যমে ডেটা যুক্ত করা হয়েছে।SortedBag ব্যবহারের মাধ্যমে আপনি ডেটার উপর সোজা এবং স্বয়ংক্রিয়ভাবে সোর্টেশন প্রয়োগ করতে পারেন, যা বিশেষভাবে উপকারী যখন আপনি ডেটা সংরক্ষণ করতে চান এবং সেই ডেটাকে একটি নির্দিষ্ট অর্ডারে আনতে চান।
অ্যাপাচি কমন্স কালেকশনস (Apache Commons Collections) লাইব্রেরিতে TypedBag এবং SortedBag হল দুটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার যা ডেটা ম্যানিপুলেশন এবং সংগঠনের জন্য বিশেষভাবে উপকারী। TypedBag টাইপ সেফটি নিশ্চিত করতে সাহায্য করে, যেখানে শুধুমাত্র নির্দিষ্ট টাইপের উপাদান সংরক্ষণ করা যায়। অন্যদিকে, SortedBag উপাদানগুলিকে একটি নির্দিষ্ট অর্ডারে (যেমন অ্যালফাবেটিক্যাল বা নম্বরিক্যাল) সাজাতে সাহায্য করে। এই দুটি ক্লাস আপনার ডেটা ম্যানিপুলেশন এবং কালেকশন ব্যবস্থাপনা আরও শক্তিশালী ও কার্যকরী করে তোলে।
Apache Commons Collections লাইব্রেরিতে Bag একটি বিশেষ ধরনের ডেটা স্ট্রাকচার যা সাধারণভাবে উপাদানগুলির উপস্থিতি (occurrences) গুনতে এবং frequency counting করতে ব্যবহৃত হয়। Bag কোলেকশনের মধ্যে একটি উপাদান একাধিকবার উপস্থিত থাকতে পারে এবং এটি উপাদানগুলির সংখ্যা (ফ্রিকোয়েন্সি) সংরক্ষণ করে। Bag কোলেকশনগুলি উপাদানগুলির উপস্থিতি গণনা করার জন্য খুবই কার্যকরী।
এই নিবন্ধে আমরা Bag কোলেকশনের উপাদানগুলো কিভাবে গোনা (counting) যায় এবং Apache Commons Collections এ এর ব্যবহার কিভাবে করা হয় তা বিস্তারিতভাবে দেখব।
Bag হল একটি কোলেকশন যা সাধারণত frequency সংরক্ষণ করে, অর্থাৎ এটি একটি উপাদানের একাধিক উপস্থিতি অনুমোদন করে এবং উপাদানের count বা frequency ট্র্যাক করে। এটি সাধারণত java.util.Set বা java.util.List এর চেয়ে ভিন্ন, কারণ একটি উপাদান কেবল একবার থাকতে পারে এমন কোনো সীমাবদ্ধতা এখানে নেই।
Apache Commons Collections লাইব্রেরি Bag কোলেকশনের জন্য HashBag
এবং TreeBag
ইমপ্লিমেন্টেশন সরবরাহ করে।
HashBag
: এটি একটি অ্যাক্টিভ কোলেকশন যা hashing ভিত্তিক ডেটা স্টোরেজ ব্যবহার করে।TreeBag
: এটি একটি লিনিয়ার কোলেকশন যা sorted উপাদান সংরক্ষণ করে।Bag কোলেকশনে উপাদানগুলির উপস্থিতি গণনা করার জন্য getCount()
মেথড ব্যবহার করা হয়। এই মেথডটি কোলেকশনে একটি নির্দিষ্ট উপাদানের উপস্থিতি সংখ্যা (ফ্রিকোয়েন্সি) রিটার্ন করে।
import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
public class BagCountingExample {
public static void main(String[] args) {
// Create a Bag (HashBag implementation)
Bag<String> bag = new HashBag<>();
// Add elements to the Bag
bag.add("apple");
bag.add("banana");
bag.add("apple");
bag.add("cherry");
bag.add("banana");
bag.add("banana");
// Count occurrences of each element
System.out.println("apple count: " + bag.getCount("apple")); // Output: 2
System.out.println("banana count: " + bag.getCount("banana")); // Output: 3
System.out.println("cherry count: " + bag.getCount("cherry")); // Output: 1
System.out.println("grape count: " + bag.getCount("grape")); // Output: 0 (grape is not in the bag)
}
}
এখানে:
getCount("apple")
: এটি কোলেকশনে "apple" উপাদানটির উপস্থিতির সংখ্যা গণনা করে (এটি ২ বার আছে)।getCount("banana")
: এটি "banana" উপাদানটির উপস্থিতির সংখ্যা গণনা করে (এটি ৩ বার আছে)।getCount("grape")
: যদি উপাদানটি কোলেকশনে না থাকে, তবে এটি ০ রিটার্ন করবে।HashBag
এবং TreeBag
এর মধ্যে পার্থক্য:HashBag
সাধারণত দ্রুত অ্যাক্সেস প্রদান করে এবং কোনো নির্দিষ্ট অর্ডার বজায় রাখে না।TreeBag
একটি সোজানো (sorted) কোলেকশন, যেখানে উপাদানগুলো natural order বা কাস্টম অর্ডারে থাকে।এছাড়া Bag কোলেকশন কিছু অতিরিক্ত কার্যকারিতা প্রদান করে যা কোলেকশন ম্যানিপুলেশন এবং ফ্রিকোয়েন্সি গণনার জন্য সহায়ক। এর মধ্যে কিছু গুরুত্বপূর্ণ মেথড হল:
add()
এবং remove()
:add()
মেথডের মাধ্যমে কোলেকশনে একটি নতুন উপাদান যোগ করা যায়।remove()
মেথডের মাধ্যমে একটি নির্দিষ্ট উপাদান সরিয়ে ফেলা যায়।uniqueSet()
:এটি Bag এর উপাদানগুলির unique set প্রদান করে, অর্থাৎ কেবলমাত্র একবার উপস্থিত থাকা উপাদানগুলো।
import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
import java.util.Set;
public class BagUniqueSetExample {
public static void main(String[] args) {
// Create a Bag (HashBag implementation)
Bag<String> bag = new HashBag<>();
// Add elements to the Bag
bag.add("apple");
bag.add("banana");
bag.add("apple");
bag.add("cherry");
// Get unique set of elements
Set<String> uniqueSet = bag.uniqueSet();
System.out.println("Unique elements: " + uniqueSet); // Output: [apple, banana, cherry]
}
}
এখানে:
uniqueSet()
মেথডটি শুধুমাত্র একটি একক উপস্থিতির সাথে উপাদানগুলো প্রদান করে। এটি apple, banana, এবং cherry কে একবার দেখাবে, যদিও তাদের ফ্রিকোয়েন্সি ভিন্ন।removeCount()
:এই মেথডটি একটি নির্দিষ্ট উপাদানের সংখ্যা হ্রাস করে।
bag.remove("apple", 1); // Removes 1 occurrence of "apple"
আপনি যদি Apache Commons Collections ব্যবহার করতে চান, তবে আপনাকে এটি আপনার প্রোজেক্টে যুক্ত করতে হবে। যদি আপনি Maven ব্যবহার করেন, তবে আপনার pom.xml ফাইলে নিম্নলিখিত ডিপেনডেন্সি যোগ করতে হবে:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
এটি Apache Commons Collections লাইব্রেরি আপনার প্রোজেক্টে যুক্ত করবে, যার মাধ্যমে আপনি Bag এবং অন্যান্য ফিচার ব্যবহার করতে পারবেন।
Apache Commons Collections লাইব্রেরির Bag কোলেকশনটি এমন একটি শক্তিশালী ডেটা স্ট্রাকচার যা উপাদানগুলির উপস্থিতি গণনা করে এবং frequency counting এর জন্য ব্যবহার করা হয়। getCount()
মেথডের মাধ্যমে আপনি যে কোন উপাদানের ফ্রিকোয়েন্সি সহজেই পেতে পারেন। Bag কোলেকশনটি বিভিন্ন কার্যকারিতার সাথে আসে যেমন add()
, remove()
, uniqueSet()
, এবং removeCount()
, যা কোলেকশন ম্যানিপুলেশনকে আরও সহজ এবং কার্যকরী করে তোলে।
common.read_more